package org.xlp.mvc.register;

import org.xlp.bean.base.IBeanDefinitionCreator;
import org.xlp.bean.impl.CustomBeanDefinitionCreator;

import java.lang.annotation.Annotation;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;

/**
 * bean定义创建器注册
 */
public class BeanDefinitionCreatorRegister {
    /**
     * 存储bean定义创建器，含有指定注解的bean定义创建器
     */
    protected final static Map<Class<? extends Annotation>, IBeanDefinitionCreator> BEAN_DEFINITION_CREATOR_MAP =
            new LinkedHashMap<>(8);

    /**
     * 当扫描出的类没有符合相应注解时，使用该Bean定义创建器
     */
    private static IBeanDefinitionCreator customBeanDefinitionCreator = new CustomBeanDefinitionCreator();

    /**
     * 注册用户自定义Bean定义创建器
     * @param customBeanDefinitionCreator
     */
    public static void register(IBeanDefinitionCreator customBeanDefinitionCreator){
        if (customBeanDefinitionCreator != null) {
            BeanDefinitionCreatorRegister.customBeanDefinitionCreator = customBeanDefinitionCreator;
        }
    }

    /**
     * 获取用户自定义Bean定义创建器
     * @return
     */
    public static IBeanDefinitionCreator getCustomBeanDefinitionCreator() {
        return customBeanDefinitionCreator;
    }

    /**
     * 注册指定注解类型的bean定义创建器
     * @param annotationClass 类型注解
     * @param beanDefinitionCreator 注解对应的bean定义创建器
     */
    public static void register(Class<? extends Annotation> annotationClass, IBeanDefinitionCreator beanDefinitionCreator){
        if (annotationClass != null && beanDefinitionCreator != null){
            synchronized (BEAN_DEFINITION_CREATOR_MAP){
                BEAN_DEFINITION_CREATOR_MAP.put(annotationClass, beanDefinitionCreator);
            }
        }
    }

    /**
     * 根据给定注解类型获取相应的bean定义创建器
     * @param annotationClass
     * @return
     */
    public static IBeanDefinitionCreator getBeanDefinitionCreatorByAnnotation(Class<? extends Annotation> annotationClass){
        if (annotationClass == null) return null;

        synchronized (BEAN_DEFINITION_CREATOR_MAP){
            return BEAN_DEFINITION_CREATOR_MAP.get(annotationClass);
        }
    }

    /**
     * 获取所有注解key
     * @return
     */
    public static Set<Class<? extends Annotation>> getAnnotationKeys(){
        synchronized (BEAN_DEFINITION_CREATOR_MAP){
            return BEAN_DEFINITION_CREATOR_MAP.keySet();
        }
    }

    /**
     * 按指定的Key异常相应的创建器
     * @param key
     * @return 返回异常的创建器
     */
    public static IBeanDefinitionCreator removeCreator(Class<? extends Annotation> key){
        synchronized (BEAN_DEFINITION_CREATOR_MAP){
            return BEAN_DEFINITION_CREATOR_MAP.remove(key);
        }
    }

    /**
     * 清空
     */
    public static void clear(){
        synchronized (BEAN_DEFINITION_CREATOR_MAP){
            BEAN_DEFINITION_CREATOR_MAP.clear();
        }
    }
}
